home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 July / Macworld (1999-07).dmg / Shareware World / Comms & Internet / HTML and CSS modes / HTML and CSS Modes / htmlMode.tcl < prev    next >
Text File  |  1999-04-24  |  40KB  |  1,100 lines

  1. ## -*-Tcl-*-
  2.  # ###################################################################
  3.  #  HTML mode 2.1.4: tools for editing HTML documents
  4.  # 
  5.  #  FILE: "htmlMode.tcl"
  6.  #                                    created: 95-04-26 14.49.04 
  7.  #                                last update: 99-04-24 12.15.58 
  8.  #  Author: Johan Linde
  9.  #  E-mail: <jlinde@telia.com>
  10.  #     www: <http://www.theophys.kth.se/~jl/Alpha.html>
  11.  #  
  12.  # Version: 2.1.4
  13.  # 
  14.  # version 0.24 (16 July 95) by Scott W. Brim <swb1@cornell.edu>
  15.  # version 1.0 -- 2.1.4 (April 99) by Johan Linde <jlinde@telia.com>
  16.  #
  17.  # Copyright 1996-1999 by Johan Linde
  18.  #  
  19.  # This software may be used freely, and distributed freely, as long as the 
  20.  # receiver is not obligated in any way by receiving it.
  21.  #  
  22.  # If you make improvements to this file, please share them!
  23.  # 
  24.  # ###################################################################
  25.  ##
  26.  
  27. if {[alpha::package vsatisfies ${alpha::version} 7.1b1]} {
  28. alpha::mode HTML 2.1.4 htmlMenu \
  29.   {*.html *.htm *.shtml *.HTML *.HTM *.SHTML } {
  30.     htmlMenu htmlUtilsMenu electricBraces electricSemicolon electricReturn electricTab
  31. } {
  32.     addMenu     htmlMenu
  33.     addMenu     htmlUtilsMenu
  34.     lunion mode::features(HTML) -betterTemplates
  35. } uninstall {
  36.     set __dir [file dirname [procs::find htmlMenu]]
  37.     foreach __file {Mode 40 Custom Elems Engine Entities HomePageUtils Menu StatusBar Utils} {
  38.         catch {removeFile $__dir:html${__file}.tcl}
  39.     }
  40.     catch {removeFile "$HOME:Tcl:Completions:HTMLCompletions.tcl"}
  41.     if {[procs::find cssMenu] == ""} {
  42.         catch {removeFile $__dir:hctsmsl.tcl}
  43.         catch {removeFile $__dir:hctsmslShared.tcl}
  44.         catch {removeFile $__dir:hctsmslMenu.tcl}
  45.         catch {removeFile "$HOME:Help:HTML Help"}
  46.         catch {removeFile "$HOME:Tcl:Completions:CSSCompletions.tcl"}
  47.     }
  48. } maintainer {
  49.     "Johan Linde" jlinde@telia.com <http://www.theophys.kth.se/~jl/Alpha.html>
  50. } help {file "HTML Help"}
  51. catch {unset HTMLmodeVars(elecRBrace)}
  52. catch {unset HTMLmodeVars(elecLBrace)}
  53. catch {unset HTMLmodeVars(electricSemi)}
  54. catch {unset HTMLmodeVars(electricTab)}
  55. } else {
  56. ;alpha::mode HTML 2.1.4 htmlMenu \
  57.   {*.html *.htm *.shtml *.HTML *.HTM *.SHTML } {htmlMenu htmlUtilsMenu} {
  58.     addMenu     htmlMenu
  59.     addMenu     htmlUtilsMenu
  60. } uninstall {
  61.     set __dir [file dirname [procs::find htmlMenu]]
  62.     foreach __file {Mode 40 Custom Elems Engine Entities HomePageUtils Menu StatusBar Utils} {
  63.         catch {removeFile $__dir:html${__file}.tcl}
  64.     }
  65.     catch {removeFile "$HOME:Tcl:Completions:HTMLCompletions.tcl"}
  66.     if {[procs::find cssMenu] == ""} {
  67.         catch {removeFile $__dir:hctsmsl.tcl}
  68.         catch {removeFile $__dir:hctsmslShared.tcl}
  69.         catch {removeFile $__dir:hctsmslMenu.tcl}
  70.         catch {removeFile "$HOME:Help:HTML Help"}
  71.         catch {removeFile "$HOME:Tcl:Completions:CSSCompletions.tcl"}
  72.     }
  73. } maintainer {
  74.     "Johan Linde" jlinde@telia.com <http://www.theophys.kth.se/~jl/Alpha.html>
  75. } help {file "HTML Help"}
  76. # Electric left brace?
  77. newPref f elecRBrace 1 HTML
  78. # Electric right brace?
  79. newPref f elecLBrace 1 HTML
  80. # Electric semi colon?
  81. newPref f electricSemi 1 HTML
  82. newPref f electricTab 1 HTML
  83. }
  84.  
  85. # called by Alpha to load HTML in.  
  86. proc htmlMenu {} {}
  87. proc htmlUtilsMenu {} {}
  88.  
  89. # A few definitions so that HTML mode runs with Alpha 7.0.
  90. if {![info exists elecStopMarker]} {
  91.     set elecStopMarker •
  92. }
  93. if {![alpha::package vsatisfies ${alpha::version} 7.0p5]} {
  94. ;proc is::Whitespace {anyString} {
  95.     return [regexp "^\[ \t\r\n\]*$" $anyString]
  96. }
  97. ;proc is::UnsignedInteger {str1} {
  98.     return [regexp {^[0-9]+$} [string trim $str1]]
  99. }
  100. ;proc is::PositiveInteger {str1} {
  101.     if [is::UnsignedInteger $str1] {
  102.         return [expr $str1 > 0]
  103.     }
  104.     return 0
  105. }
  106. }
  107. if {![alpha::package vsatisfies ${alpha::version} 7.1b1]} {
  108. ;proc bind::fromArray {arr bindarr {unbind 0} {mode {}}} {
  109.     upvar $arr ar
  110.     upvar $bindarr br
  111.     set r {}
  112.     if {$unbind} {
  113.         set bindcmd "unbind"
  114.     } else {
  115.         set bindcmd "bind"
  116.     }
  117.     foreach a [array names ar] {
  118.         if {[set b $ar($a)] != ""} {
  119.             if [info exists br($a)] {
  120.                 catch {eval $bindcmd [keys::toBind $b] [list $br($a)] $mode}
  121.             } else {
  122.                 beep; message "Bad bind-array entry '$a'"
  123.             }
  124.         }
  125.     }
  126. }
  127. ;proc ::indentRegion {} {indentRegion}
  128. }
  129.  
  130.  
  131. #===============================================================================
  132. # Global variables and their management
  133. #===============================================================================
  134.  
  135. # Unsetting some old prefs
  136. foreach _tmp {htmlPackageToUse hideNetscape hideIE inclEventHandler hideStyleAttrs useAttsApplyToDialogs} {
  137.     catch {unset HTMLmodeVars($_tmp)}
  138. }
  139.  
  140. set htmlIconTxt {"Netscape Navigator 3" "Netscape Navigator 4" "Netscape Communicator" "Internet Explorer" Cyberdog MacLynx Mosaic}
  141. set htmlIcons {•135 •293 •294 •295 •281 •296 •942}
  142.  
  143. # Menu icons
  144. newPref v htmlMenuIcon •294 HTML
  145. newPref v htmlUtilsMenuIcon •281 HTML
  146.  
  147. if {$HTMLmodeVars(htmlMenuIcon) == $HTMLmodeVars(htmlUtilsMenuIcon)} {
  148.     foreach _tmp $htmlIcons {
  149.         if {$HTMLmodeVars(htmlMenuIcon) != $_tmp} {
  150.             set HTMLmodeVars(htmlUtilsMenuIcon) $_tmp
  151.             lappend modifiedModeVars {htmlUtilsMenuIcon HTMLmodeVars}
  152.             break
  153.         }
  154.     }
  155. }
  156.  
  157. set htmlMenu $HTMLmodeVars(htmlMenuIcon)
  158. set htmlUtilsMenu $HTMLmodeVars(htmlUtilsMenuIcon)
  159.  
  160. # Line width
  161. newPref v fillColumn 75 HTML
  162. newPref v leftFillColumn 0 HTML
  163. # word breaking and word wrapping
  164. newPref v wordBreak {\w+} HTML
  165. newPref v wordBreakPreface {(\W)} HTML
  166. newPref v wrapBreak {[\w_]+} HTML
  167. newPref v wrapBreakPreface {([^\w_])} HTML
  168. newPref f wordWrap    1 HTML
  169.  
  170. # Indentation
  171. newPref f indentAPPLET 0 HTML
  172. newPref f indentBLOCKQUOTE 0 HTML
  173. newPref f indentBODY 0 HTML
  174. newPref f indentCENTER 0 HTML
  175. newPref f indentDIR 1 HTML
  176. newPref f indentDIV 0 HTML
  177. newPref f indentDL 1 HTML
  178. newPref f indentFIELDSET 0 HTML
  179. newPref f indentFORM 0 HTML
  180. newPref f indentFRAMESET 0 HTML
  181. newPref f indentHEAD 0 HTML
  182. newPref f indentMAP 0 HTML
  183. newPref f indentMENU 1 HTML
  184. newPref f indentMULTICOL 0 HTML
  185. newPref f indentNOEMBED 0 HTML
  186. newPref f indentNOFRAMES 0 HTML
  187. newPref f indentNOSCRIPT 0 HTML
  188. newPref f indentOBJECT 0 HTML
  189. newPref f indentOL 1 HTML
  190. newPref f indentOPTGROUP 0 HTML
  191. newPref f indentP 0 HTML
  192. newPref f indentSELECT 0 HTML
  193. newPref f indentTABLE 1 HTML
  194. newPref f indentTR 1 HTML
  195. newPref f indentUL 1 HTML
  196. set htmlIndentElements {HEAD BODY P DIV BLOCKQUOTE CENTER MULTICOL OBJECT NOEMBED OL UL DIR MENU DL
  197. FORM FIELDSET SELECT OPTGROUP TABLE TR FRAMESET NOFRAMES MAP APPLET NOSCRIPT}
  198.  
  199. # browsers
  200. if {![info exists browserSig] && [catch {getFileSig [icGetPref -t 1 Helper•http]} browserSig]} {set browserSig MOSS}
  201. # Browser signatures
  202. newPref v browsers {MOSS MSIE} HTML
  203.  
  204. newPref v prefixString    "<!-- " HTML
  205. newPref v suffixString    " -->" HTML
  206.  
  207. # Paths to footer files.
  208. newPref v footers {} HTML
  209. # Tag color
  210. newPref v tagColor        blue HTML
  211. # Attribute color
  212. newPref v attributeColor magenta HTML
  213. # Simple coloring?
  214. newPref f simpleColoring 0 HTML
  215. # Should elements be lower case?
  216. newPref f useLowerCase    0 HTML
  217. # Should •'s be inserted?
  218. newPref    f useTabMarks    1 HTML
  219. # Is <p> a container?
  220. newPref f pIsContainer    1 HTML
  221. # Are LI DT and DD containers 
  222. newPref f lidtAreContainers 0  HTML
  223. # A window cache with frames.
  224. newPref v windows        {} HTML
  225. # When browser is launched, should it be brought to front?
  226. newPref    f browseInForeground    1 HTML
  227. # Save without asking when sending file to browser?
  228. newPref f saveWithoutAsking 0 HTML
  229. # Default list of commonly used character entities
  230. newPref v defaultCommonChars {"less than" "greater than" "ampersand" "nonbreak space"} HTML
  231. # List of commonly used character entities
  232. newPref v commonChars $HTMLmodeVars(defaultCommonChars) HTML
  233. # Never ask about extensions?
  234. newPref f hideExtensions 0 HTML
  235. # Never ask about deprecated elements and attributes?
  236. newPref f hideDeprecated 0 HTML
  237. # Attributes globally not asked about at first
  238. newPref v dontaskforAttributes {} HTML
  239. # Attributes globally never asked about
  240. newPref v neveraskforAttributes {} HTML
  241. # Attributes globally always asked about
  242. newPref v alwaysaskforAttributes {} HTML
  243. # Beep when asking for attributes in the status bar?
  244. newPref f promptNoisily 1 HTML
  245. # Flash status bar for first attribute?
  246. newPref f flashStatusBar 1 HTML
  247. # Input from dialog windows or status bar?
  248. newPref f useBigWindows 1 HTML
  249. # Change attributes in dialog windows or status bar?
  250. newPref f changeInBigWindows 1 HTML
  251. # Cmd-double-click on non text file link opens file?
  252. newPref f openNonTextFile 1 HTML
  253. # Return on non text file in home page window opens file?
  254. newPref f homeOpenNonTextFile 1 HTML
  255. # Check anchors in links?
  256. newPref f checkAnchors 1 HTML
  257. # Case sensistive link checking?
  258. newPref f caseSensitive 0 HTML
  259. # Check links with Big Brother?
  260. newPref f useBigBrother 0 HTML
  261. newPref f checkInFront 1 HTML
  262. newPref f useBBoptions 1 HTML
  263. newPref f ignoreRemote 0 HTML
  264. newPref f ignoreLocal 0 HTML
  265. # Folder for HTML manual.
  266. newPref v manualFolder "$HOME:HTML mode manual" HTML
  267. newPref v manualStartPage 0 HTML
  268. # FTP servers
  269. newPref v FTPservers {} HTML
  270. # Last modified string
  271. newPref v lastModified "Last modified" HTML
  272. # 'Insert include tags' only inserts tags, and not the file?
  273. newPref f includeOnlyTags 1 HTML
  274. # Color JavaScript keywords?
  275. newPref f JavaScriptColoring 0 HTML
  276. # Color of JavaScript keywords
  277. newPref v JavaScriptColor    magenta HTML
  278. # Color of strings
  279. newPref v stringColor green HTML
  280. # Color of JavaScript comments
  281. newPref v JavaCommentColor red HTML
  282. # Color CSS keywords?
  283. newPref f CSSColoring 0 HTML
  284. # Color of CSS keywords
  285. newPref v CSSColor cyan HTML
  286.  
  287.  
  288. # These attributes are URLs.
  289. set htmlURLAttr    {HREF= SRC= LOWSRC= ACTION= USEMAP= BACKGROUND= CODEBASE= PLUGINSPAGE=
  290. DYNSRC= CLASSID= DATA= CITE= LONGDESC= PROFILE=}
  291. # These element attributes are colors
  292. set htmlColorAttr    {BGCOLOR= TEXT= LINK= VLINK= ALINK= COLOR= BORDERCOLOR=
  293. BORDERCOLORDARK= BORDERCOLORLIGHT=}
  294. # These attributes are windows
  295. set htmlWindowAttr {TARGET=}
  296. # Special cases with URLs, colors and windows
  297. set htmlSpecURL {}
  298. set htmlSpecColor {}
  299. set htmlSpecWindow {}
  300. # These elements can be in document HEAD.
  301. set htmlHeadElements1 {BASE ISINDEX LINK META STYLE SCRIPT OBJECT}
  302. # These elements are plug-ins.
  303. set htmlPlugins {EMBED LIVEAUDIO LIVEVIDEO "QUICKTIME MOVIE" "QUICKTIME VR" REALAUDIO}
  304. # HTML mode version
  305. set htmlVersion 2.14
  306.  
  307. # Register eventhandler for Big Brother events
  308. eventHandler Bbth Chkd htmlBbthChkdHandler 
  309.  
  310. # Used by fillParagraph
  311. set htmlParaCommands {html|head|title|body|h[1-6]|p|div|blockquote|center|address|pre|multicol}
  312. append htmlParaCommands {|br|hr|wbr|basefont|ul|ol|li|dir|menu|dl|dd|dt|form|input}
  313. append htmlParaCommands {|select|option|textarea|caption|table|tr|frameset|frame|noframes}
  314. append htmlParaCommands {|map|area|applet|param|script|noscript|layer|ilayer|nolayer|base|link|meta|isindex}
  315. append htmlParaCommands {|col|colgroup|marquee|object|thead|tbody|tfoot}
  316. append htmlParaCommands {|bdo|ins|del|fieldset|legend|button|optgroup}
  317.  
  318. #
  319. # Internal Globals
  320. #
  321. set htmlCurSel    ""
  322. set htmlIsSel    0
  323. set htmlAdditionExist 0
  324. set htmlHomePageWinList {}
  325. set homeTime 0
  326. set htmlNumBbthChecking 0
  327. set htmlHideDeprecated 0
  328. set htmlHideExtensions 0
  329. set htmlHideFrames 0
  330.  
  331. # Load other HTML mode files.
  332. foreach tmp {htmlEngine htmlElems htmlEntities htmlUtils hctsmslShared hctsmslMenu htmlMenu} {
  333.     if {[info exists cssModeIsLoaded] && ($tmp == "hctsmslMenu" || $tmp == "hctsmslShared")} {continue}
  334.     if { [catch {eval ${tmp}.tcl}] } {
  335.         beep
  336.         alertnote "Loading of ${tmp}.tcl failed"
  337.         return
  338.     }
  339. }
  340.  
  341. if {(!$HTMLmodeVars(useBigWindows) || !$HTMLmodeVars(changeInBigWindows)) && [catch {htmlStatusBar.tcl}] } {
  342.     beep
  343.     alertnote "Loading of htmlStatusBar.tcl failed"
  344.     return
  345. }
  346.  
  347. # Silently add missing menu.
  348. if {[info exists modeMenus(HTML)]} {
  349.     if {[lsearch -exact $modeMenus(HTML) htmlMenu] < 0} {
  350.         lappend modeMenus(HTML) htmlMenu
  351.     }
  352.     if {[lsearch -exact $modeMenus(HTML) htmlUtilsMenu] < 0} {
  353.         lappend modeMenus(HTML) htmlUtilsMenu
  354.     }
  355. }
  356. if {[info exists mode::features(HTML)]} {
  357.     if {[lsearch -exact [set mode::features(HTML)] htmlMenu] < 0} {
  358.         lappend mode::features(HTML) htmlMenu
  359.     }
  360.     if {[lsearch -exact [set mode::features(HTML)] htmlUtilsMenu] < 0} {
  361.         lappend mode::features(HTML) htmlUtilsMenu
  362.     }
  363. }
  364.  
  365. # Clean up tmp files
  366. if {[file exists $PREFS:HTMLtmp]} {
  367.     if {[file exists $PREFS:HTMLtmp:incl]} {catch {rm -r $PREFS:HTMLtmp:incl}}
  368.     if {[file exists $PREFS:HTMLtmp:xincl]} {catch {rm -r $PREFS:HTMLtmp:xincl}}
  369.     catch {rm $PREFS:HTMLtmp:*}
  370. }
  371.  
  372.  
  373. #
  374. # Read custom elements
  375. #
  376.  
  377. proc htmlReadAdditions {} {
  378.     global PREFS htmlElemAttrRequired1 htmlElemAttrOptional1 htmlElemAttrChoices1
  379.     global htmlElemAttrNumber1 htmlElemEventHandler1 htmlElemKeyBinding htmlElemProc
  380.     global htmlURLAttr htmlColorAttr htmlWindowAttr htmlPlugins
  381.     global htmlSpecURL htmlSpecColor htmlSpecWindow htmlVersion htmlShownWarning
  382.  
  383.     html40.tcl
  384.     message "Loading custom elements…"
  385.     
  386.     
  387.     if {[catch {open $PREFS:HTMLadditions.tcl r} fid]} {
  388.         alertnote "Could not open the file HTMLAdditions.tcl with your custom elements."
  389.         return
  390.     }
  391.     set additions [read -nonewline $fid]
  392.     close $fid
  393.     set lines [split $additions "\n"]
  394.     set version [lindex $lines 0]
  395.     if {$version == $htmlVersion} {htmlReadAdditions0 $lines; return}
  396.     if {$version > $htmlVersion} {
  397.         regsub "\[^\n\]+" $additions $htmlVersion additions
  398.         set fid [open $PREFS:HTMLadditions.tcl w]
  399.         puts $fid $additions
  400.         close $fid
  401.         htmlReadAdditions0 $lines
  402.         return
  403.     }
  404.     set allattrs [htmlGetAllAttrs]
  405.     set newLines "$htmlVersion\n"
  406.     set changed 0
  407.     set tmpSpecURL ""
  408.     set tmpSpecColor ""
  409.     set tmpSpecWindow ""
  410.     foreach line [lrange $lines 1 end] {
  411.         set elem [lindex $line 0]
  412.         set command [lindex $line 1]
  413.         set elemExists [info exists htmlElemAttrOptional1($elem)]
  414.         if {$elemExists} {
  415.             foreach x [list AttrOptional1 AttrRequired1 AttrNumber1 AttrChoices1 EventHandler1] {
  416.                 if {[info exists htmlElem${x}($elem)]} {
  417.                     set $x [string toupper [set htmlElem${x}($elem)]]
  418.                 } else {
  419.                     set $x ""
  420.                 }
  421.             }
  422.             set attrs [concat $AttrOptional1 $AttrRequired1 $EventHandler1]
  423.             foreach at $attrs {
  424.                 if {[string trimright $at =] == $at} {
  425.                     lappend attrs "${at}="
  426.                 } else {
  427.                     lappend attrs [string trimright $at =]
  428.                 }
  429.             }
  430.         } else {
  431.             set attrs {}
  432.         }
  433.         set var [lindex $command 1]
  434.         foreach ucw [list URL Color Window] {
  435.             if {$var == "html${ucw}Attr"} {
  436.                 set att [lindex $command 2]
  437.                 if {[lsearch -exact [set html${ucw}Attr] $att] >=0} {
  438.                     # Already defined.
  439.                     set changed 1
  440.                 } elseif {[lsearch -exact $allattrs $att] >=0 || [lsearch -exact $allattrs [string trimright $att =]] >=0} {
  441.                     # Used for some other kind of attr.
  442.                     lappend ${ucw}SpecMaybe $att
  443.                     set changed 1
  444.                 } elseif {[lsearch -exact $attrs $att] >= 0} {
  445.                     # Attr already exists for elem.
  446.                     lappend ${ucw}Maybe $att
  447.                     set changed 1
  448.                 } else {
  449.                     append newLines "$line\n"
  450.                 }
  451.             }
  452.             if {$var == "htmlSpec${ucw}"} {
  453.                 set tmpadd [lrange $command 2 end]
  454.                 foreach x $tmpadd {
  455.                     regexp {[^!=]!?=(.*)} $x dum tmp
  456.                     # Only add if attr doesn't exist.
  457.                     if {[lsearch -exact $attrs $tmp] >= 0} {
  458.                         set changed 1
  459.                         set where [lsearch -exact $tmpadd $x]
  460.                         set tmpadd [lreplace $tmpadd $where $where]
  461.                     }
  462.                 }
  463.                 if {[llength $tmpadd]} {
  464.                     append newLines "[list $elem] \{lappend htmlSpec${ucw} $tmpadd\}\n"
  465.                     append tmpSpec${ucw} " " $tmpadd
  466.                 }
  467.             }
  468.         }
  469.         if {[lsearch {htmlURLAttr htmlColorAttr htmlWindowAttr htmlSpecURL \
  470.         htmlSpecColor htmlSpecWindow} $var] < 0} {
  471.             # If element doesn't exist, GO!
  472.             if {!$elemExists} {
  473.                 append newLines "$line\n"
  474.                 regsub "html" $command "tmp" command
  475.                 eval $command
  476.                 continue
  477.             }
  478.             # Skip these vars if element exists.
  479.             if {[string match "htmlElemKeyBinding*" $var] || [string match "htmlElemProc*" $var] ||
  480.             $var == "htmlPlugins"} {
  481.                 set changed 1
  482.                 continue
  483.             }
  484.             regexp {([^\(]+)\(([^\)]+)\)[ ]+(.+)} [lrange $command 1 end] dummy var arg added
  485.             set added [string trimleft [string trimright $added \}] \{]
  486.             foreach c $added {
  487.                 if {$var == "htmlElemAttrChoices1"} {
  488.                     regexp {[^=]*=} $c tmp
  489.                     # Don't add choices if they exist or if attr isn't a choice attr.
  490.                     if {[lsearch -exact $AttrChoices1 $c] >= 0 || ([lsearch -exact $attrs $tmp] >= 0 &&
  491.                     [lsearch $AttrChoices1 "${tmp}*"] < 0) } {
  492.                         set changed 1
  493.                         set where [lsearch -exact $added $c]
  494.                         set added [lreplace $added $where $where]
  495.                     }
  496.                 } else {
  497.                     if {$var == "htmlElemAttrNumber1"} {
  498.                         regexp {[^=]*=} $c tmp
  499.                     } else {
  500.                         set tmp [string toupper $c]
  501.                     }
  502.                     # Don't add attrs which exist.
  503.                     if {[lsearch -exact $attrs $tmp] >= 0} {
  504.                         set changed 1
  505.                         set where [lsearch -exact $added $c]
  506.                         set added [lreplace $added $where $where]
  507.                     }
  508.                 }
  509.             }
  510.             if {[llength $added]} {
  511.                 append newLines "[list $elem] \{lappend ${var}($arg) $added\}\n"
  512.                 regsub "html" $var "tmp" var
  513.                 eval "lappend ${var}($arg) $added"
  514.             }
  515.         }
  516.     }
  517.     foreach ucw [list URL Color Window] {
  518.         if {[info exists ${ucw}SpecMaybe]} {
  519.             foreach m [set ${ucw}SpecMaybe] {
  520.                 foreach e [array names tmpElemAttrRequired1] {
  521.                     if {[lsearch -exact $tmpElemAttrRequired1($e) $m] >= 0 && \
  522.                     [lsearch -exact [set tmpSpec$ucw] "$e!=[string trimright $m =]"] < 0} {
  523.                         append newLines "[list $e] \{lappend htmlSpec${ucw} ${e}=[string trimright $m =]\}\n"
  524.                     } 
  525.                 }
  526.                 foreach e [array names tmpElemAttrOptional1] {
  527.                     if {[lsearch -exact $tmpElemAttrOptional1($e) $m] >= 0 && \
  528.                     [lsearch -exact [set tmpSpec$ucw] "$e!=[string trimright $m =]"] < 0} {
  529.                         append newLines "[list $e] \{lappend htmlSpec${ucw} ${e}=[string trimright $m =]\}\n"
  530.                     } 
  531.                 }
  532.             }
  533.         }
  534.         if {[info exists ${ucw}Maybe]} {
  535.             foreach m [set ${ucw}Maybe] {
  536.                 set foundit 0
  537.                 foreach e [array names tmpElemAttrRequired1] {
  538.                     if {[lsearch -exact $tmpElemAttrRequired1($e) $m] >= 0 && \
  539.                     [lsearch -exact [set tmpSpec$ucw] "$e!=[string trimright $m =]"] < 0} {
  540.                         append newLines "[list $e] \{lappend html${ucw}Attr $m\}\n"
  541.                         set foundit 1
  542.                         break
  543.                     } 
  544.                 }
  545.                 if {$foundit} {continue}
  546.                 foreach e [array names tmpElemAttrOptional1] {
  547.                     if {[lsearch -exact $tmpElemAttrOptional1($e) $m] >= 0 && \
  548.                     [lsearch -exact [set tmpSpec$ucw] "$e!=[string trimright $m =]"] < 0} {
  549.                         append newLines "[list $e] \{lappend html${ucw}Attr $m\}\n"
  550.                         break
  551.                     } 
  552.                 }
  553.             }
  554.         }    
  555.     }
  556.     
  557.     if {$newLines != "$htmlVersion\n"} {htmlReadAdditions0 [split [string trimright $newLines "\n"] "\n"]}
  558.     if {$changed} {
  559.         beep
  560.         if {[lindex [dialog -w 300 -h 270 -b "Clean up" 20 240 100 260 \
  561.         -b "Leave it" 120 240 200 260 -t "Some of your custom elements are supported by this\
  562.         version of HTML mode." 10 10 290 45 -t "Choose 'Clean up' to update your file with custom\
  563.         elements and to avoid this alert next time you run Alpha.\
  564.         If you do so, some elements will not be defined correctly if you go back to\
  565.         a previous version of HTML mode." 10 50 290 150 -t "Choose 'Leave it' to leave your file\
  566.         with custom elements untouched. If you do so, the submenu 'Extend', where you can add new custom\
  567.         elements, will be disabled." 10 160 290 225] 1]} {
  568.             set htmlShownWarning 1
  569.             return
  570.         }
  571.     }
  572.     if {$newLines == "$htmlVersion\n"} {
  573.         removeFile $PREFS:HTMLadditions.tcl
  574.     } else {
  575.         set fid [open $PREFS:HTMLadditions.tcl w]
  576.         puts -nonewline $fid $newLines
  577.         close $fid
  578.     }
  579. }
  580.  
  581. proc htmlReadAdditions0 {lines} {
  582.     global htmlElemAttrRequired1 htmlElemAttrOptional1 htmlElemAttrChoices1
  583.     global htmlElemAttrNumber1 htmlElemEventHandler1 htmlElemKeyBinding htmlElemProc
  584.     global htmlURLAttr htmlColorAttr htmlWindowAttr htmlPlugins
  585.     global htmlSpecURL htmlSpecColor htmlSpecWindow htmlAdditionExist htmlShownWarning
  586.     
  587.     foreach line [lrange $lines 1 end] {
  588.         if {[catch {eval [lindex $line 1]}]} {
  589.             alertnote "There is an error in the file HTMLAdditions.tcl with your custom elements."
  590.             set htmlShownWarning 1
  591.             break
  592.         }
  593.     }
  594.     set htmlAdditionExist 1
  595. }
  596.  
  597. #
  598. # Color support
  599. #
  600.  
  601. proc htmlColorizing {{changing 0}} {
  602.      global HTMLmodeVars HTMLwords htmlElemAttrOptional1 htmlElemAttrRequired1
  603.      global htmlElemEventHandler1 PREFS htmlElemKeyBinding
  604.      
  605.      set HTMLKeyWords {}
  606.     if {[info exists HTMLwords]} {set HTMLKeyWords $HTMLwords}
  607.  
  608.     if {!$HTMLmodeVars(simpleColoring)} {
  609.         # All HTML elements
  610.         set allHTMLwords [concat {A ABBR ACRONYM ADDRESS APPLET AREA B BASE 
  611.         BASEFONT BDO BGSOUND BIG BLINK BLOCKQUOTE BODY BR BUTTON CAPTION 
  612.         CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM EMBED 
  613.         FIELDSET FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I 
  614.         IFRAME ILAYER IMG INPUT INS ISINDEX KBD KEYGEN LABEL LAYER LEGEND 
  615.         LI LINK MAP MARQUEE MENU META MULTICOL NOBR NOEMBED NOFRAMES 
  616.         NOLAYER NOSCRIPT OBJECT OL OPTGROUP OPTION P PARAM PRE Q S SAMP 
  617.         SCRIPT SELECT SERVER SMALL SPACER SPAN STRIKE STRONG STYLE SUB SUP TABLE 
  618.         TBODY TD TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR WBR} [array names htmlElemKeyBinding]]
  619.     
  620.         foreach elem $allHTMLwords {
  621.             lappend allHTMLkeywords "<${elem}" "/${elem}"
  622.         }
  623.         # All attributes
  624.         set attributeWords {ABBR= ABOVE= ACCEPT-CHARSET= ACCEPT= ACCESSKEY= 
  625.         ACTION= ALIGN= ALINK= ALT= ARCHIVE= AUTOPLAY= AUTOSTART= AXIS= 
  626.         BACKGROUND= BEHAVIOR= BELOW= BGCOLOR= BGPROPERTIES= BORDER= 
  627.         BORDERCOLOR= BORDERCOLORDARK= BORDERCOLORLIGHT= CELLPADDING= 
  628.         CELLSPACING= CHALLENGE= CHAR= CHAROFF= CHARSET= CHECKED CITE= 
  629.         CLASS= CLASSID= CLEAR= CLIP= CODE= CODEBASE= CODETYPE= COLOR= COLS= 
  630.         COLSPAN= COMPACT CONSOLE= CONTENT= CONTROLLER= CONTROLS CONTROLS= 
  631.         COORDS= CORRECTION= DATA= DATETIME= DECLARE DEFER DIR= DIRECTION= 
  632.         DISABLED DYNSRC= ENCTYPE= FACE= FOR= FOV= FRAME= FRAMEBORDER= 
  633.         FRAMESPACING= GUTTER= HEADERS= HEIGHT= HIDDEN= HREF= HREFLANG= 
  634.         HSPACE= HTTP-EQUIV= ID= ISMAP LABEL= LANG= LANGUAGE= LEFT= 
  635.         LEFTMARGIN= LINK= LONGDESC= LOOP= LOWSRC= MARGINHEIGHT= 
  636.         MARGINWIDTH= MAXLENGTH= MAYSCRIPT MEDIA= METHOD= MULTIPLE NAME= 
  637.         NODE= NOHREF NOLABELS= NORESIZE NOSHADE NOWRAP OBJECT= PAGEX= 
  638.         PAGEY= PAN= PLAYEVERYFRAME= PLUGINSPAGE= POINT-SIZE= PROFILE= 
  639.         PROMPT= READONLY REL= REV= ROWS= ROWSPAN= RULES= SCHEME= SCOPE= 
  640.         SCROLLAMOUNT= SCROLLDELAY= SCROLLING= SELECTED SHAPE= SIZE= SPAN= 
  641.         SRC= STANDBY= START= STYLE= SUMMARY= TABINDEX= TARGET= TEXT= TILT= 
  642.         TITLE= TOP= TOPMARGIN= TYPE= USEMAP= VALIGN= VALUE= VALUETYPE= 
  643.         VISIBILITY= VLINK= VSPACE= WIDTH= WRAP= Z-INDEX=}
  644.         # Custom element attributes
  645.         if {[file exists $PREFS:HTMLadditions.tcl] && ![catch {open $PREFS:HTMLadditions.tcl} fid]} {
  646.             set lines [lrange [split [read -nonewline $fid] "\n"] 1 end]
  647.             close $fid
  648.             foreach line $lines {
  649.                 set cmd [lindex $line 1]
  650.                 set added ""
  651.                 regexp {([^\(]+)\(([^\)]+)\)[ ]+(.+)} [lrange $cmd 1 end] dummy var arg added
  652.                 set added [string trimleft [string trimright $added \}] \{]
  653.                 if {$var == "htmlElemAttrRequired1" || $var == "htmlElemAttrOptional1"} {
  654.                     foreach attr $added {
  655.                         if {[lsearch -exact $attributeWords $attr] < 0} {
  656.                             lappend attributeWords $attr
  657.                         }
  658.                     }
  659.                 }
  660.             }
  661.         }
  662.         lappend attributeWords "FILE=" "FORM="
  663.         # JavaScript keywords.
  664.         set JavaScriptWords {break case continue default delete do export for import in 
  665.         function if else new return switch this typeof var void while with true false 
  666.         onAbort= onBlur= onChange= onClick= onDblClick= onError= onFocus= 
  667.         onKeyDown= onKeyPress= onKeyUp= onLoad= onMouseDown= onMouseMove= 
  668.         onMouseOut= onMouseOver= onMouseUp= onReset= onSelect= onSubmit= onUnload=}
  669.         # CSS keywords
  670.         set CSSwords {font-family font-style font-variant font-weight font-size font 
  671.         color background-color background-image background-repeat background-attachment
  672.         background-position background word-spacing letter-spacing text-decoration
  673.         vertical-align text-transform text-align text-indent line-height
  674.         margin-top margin-right margin-bottom margin-left margin padding-top padding-right
  675.         padding-bottom padding-left padding border-top-width border-right-width
  676.         border-bottom-width border-left-width border-width border-color border-style
  677.         border-top border-right border-bottom border-left border width height float clear
  678.         display white-space list-style-type list-style-image list-style-position list-style
  679.         @import important}
  680.         
  681.         if {!$changing} {
  682.             regModeKeywords -i "<" -i ">" -I $HTMLmodeVars(tagColor) \
  683.                 -s $HTMLmodeVars(stringColor)  -b "/*" "*/" -e "//" HTML {}
  684.         }
  685.         if {$HTMLmodeVars(JavaScriptColoring) || $HTMLmodeVars(CSSColoring)} {
  686.             set col $HTMLmodeVars(JavaCommentColor)
  687.         } else {
  688.             set col none
  689.         }
  690.         regModeKeywords -a -c $col HTML
  691.         if {$HTMLmodeVars(JavaScriptColoring)} {
  692.             set col $HTMLmodeVars(JavaScriptColor)
  693.         } else {
  694.             set col none
  695.         }
  696.         regModeKeywords -a -k $col HTML $JavaScriptWords
  697.         if {$HTMLmodeVars(CSSColoring)} {
  698.             set col $HTMLmodeVars(CSSColor)
  699.         } else {
  700.             set col none
  701.         }
  702.         regModeKeywords -a -k $col HTML $CSSwords
  703.         regModeKeywords -a -k $HTMLmodeVars(tagColor) \
  704.         HTML [concat $HTMLKeyWords $allHTMLkeywords]
  705.         regModeKeywords -a -k $HTMLmodeVars(attributeColor) HTML $attributeWords
  706.         regModeKeywords -a -k $HTMLmodeVars(JavaCommentColor) HTML {"<!--" "-->" "#INCLUDE" "/#INCLUDE"
  707.         "#LASTMODIFIED" "/#LASTMODIFIED" "#DOCINDEX" "/#DOCINDEX"}
  708.     } else {
  709.         regModeKeywords -b "<" ">" -c $HTMLmodeVars(tagColor) \
  710.         -k $HTMLmodeVars(tagColor) HTML $HTMLKeyWords
  711.     }
  712. }
  713.  
  714. # Change color when a color variable is changed.
  715. proc htmlChangeColorizing {flag} {
  716.     global HTMLmodeVars
  717.     set msg 0
  718.     switch -glob $flag {
  719.         simpleColoring {
  720.             htmlColorizing
  721.             set msg 1
  722.         }
  723.         JavaScriptColoring -
  724.         attributeColor -
  725.         CSSColoring {
  726.             if {!$HTMLmodeVars(simpleColoring)} {
  727.                 htmlColorizing 1
  728.             }
  729.         }
  730.         tagColor {
  731.             if {$HTMLmodeVars(simpleColoring)} {
  732.                 regModeKeywords -a -c $HTMLmodeVars(tagColor) HTML
  733.             } else {
  734.                 regModeKeywords -a -i "<" -i ">" -I $HTMLmodeVars(tagColor) HTML
  735.                 htmlColorizing 1
  736.             }
  737.         }
  738.         JavaScriptColor {
  739.             if {$HTMLmodeVars(JavaScriptColoring) && !$HTMLmodeVars(simpleColoring)} {
  740.                 htmlColorizing 1
  741.             }
  742.         }
  743.         JavaCommentColor {
  744.             if {($HTMLmodeVars(JavaScriptColoring) || $HTMLmodeVars(CSSColoring)) && !$HTMLmodeVars(simpleColoring)} {
  745.                 regModeKeywords -a -c $HTMLmodeVars(JavaCommentColor) HTML
  746.             }
  747.         }
  748.         CSSColor {
  749.             if {$HTMLmodeVars(CSSColoring) && !$HTMLmodeVars(simpleColoring)} {
  750.                 htmlColorizing 1
  751.             }
  752.         }    
  753.         stringColor {
  754.             if {!$HTMLmodeVars(simpleColoring)} {
  755.                 regModeKeywords -a -s $HTMLmodeVars(stringColor) HTML
  756.             }
  757.         }
  758.     }
  759.     refresh
  760.     if {$msg} {message "Coloring may not change until you switch to another window."}
  761. }
  762.  
  763. trace variable browserSig w htmlToggleBrowser2
  764.  
  765. # Dialog to set HTML mode variables.
  766. proc HTMLmodifyFlags {{which General}} {
  767.     global HTMLmodeVars modifiedModeVars htmlIconTxt htmlIcons htmlMenu htmlUtilsMenu
  768.     
  769.     if {$which == "Attributes"} {htmlGlobalAttrsPrefs; return}
  770.     
  771.     set box [eval html${which}PrefsBox]
  772.     set allFlags [eval html${which}Flags]
  773.  
  774.     set attrTxt {"status bar" "dialog boxes"}
  775.     set manTxt {"first page in manual" "table of contents without frames" "table of contents with frames"}
  776.     set values [eval [concat dialog -w 460 -h 315 -b OK 20 285 85 305 -b Cancel 110 285 175 305 $box]]
  777.     if {[lindex $values 1]} {return}
  778.     if {$which == "General" && [lindex $values 22] == [lindex $values 23]} {
  779.         alertnote "You can't use the same menu icon for both menus. Menu icon changes are ignored."
  780.         set allFlags [lrange $allFlags 0 18]
  781.     }
  782.     set i 1
  783.     if {$which == "General"} {incr i}
  784.     foreach flag $allFlags {
  785.         global $flag
  786.         incr i
  787.         set val [lindex $values $i]
  788.         if {$flag == "useBigWindows" || $flag == "changeInBigWindows"} {set val [lsearch -exact $attrTxt $val]}
  789.         if {$flag == "manualStartPage"} {set val [lsearch -exact $manTxt $val]}
  790.         if {[string match "*Icon" $flag]} {set val [lindex $htmlIcons [lsearch $htmlIconTxt $val]]}
  791.         if {$HTMLmodeVars($flag) != $val} {
  792.             set $flag $val
  793.             set HTMLmodeVars($flag) $val
  794.             lappend modifiedModeVars [list $flag HTMLmodeVars]
  795.             if {[string match "*Color*" $flag]} {htmlChangeColorizing $flag}
  796.             if {[string match "*Icon" $flag]} {
  797.                 removeMenu [set [string trim $flag "Icon"]]
  798.                 set [string trim $flag "Icon"] $val
  799.                 eval htmlBuild[string trim $flag Iconhtml]
  800.             }
  801.         }
  802.     }
  803. }
  804.  
  805. proc htmlGeneralPrefsBox {} {
  806.     global HTMLmodeVars htmlIconTxt htmlIcons alpha::colors elecStopMarker
  807.     
  808.     set attrTxt {"status bar" "dialog boxes"}
  809.     set manTxt {"first page in manual" "table of contents without frames" "table of contents with frames"}
  810.  
  811.     set box "-t {General HTML mode Preferences} 100 10 450 30 \
  812.     -m {{Page 1 of preferences} {Page 1 of preferences} {Page 2 of preferences} {Page 3 of preferences}} 100 35 300 55 \
  813.     -n {Page 1 of preferences} \
  814.     -c {Bring browser to front when sending a window to it} $HTMLmodeVars(browseInForeground) 10 65 450 80\
  815.     -c {Save window without asking when sending it to the browser} $HTMLmodeVars(saveWithoutAsking) 10 85 450 100 \
  816.     -c {Set tags in lower case} $HTMLmodeVars(useLowerCase) 10 105 200 120 \
  817.     -c {Use template stops ($elecStopMarker)} $HTMLmodeVars(useTabMarks) 10 125 450 140 \
  818.     -c {<P> has a closing tag </P>} $HTMLmodeVars(pIsContainer) 10 145 450 160 \
  819.     -c {<LI>, <DT> and <DD> have closing tags} $HTMLmodeVars(lidtAreContainers) 10 165 450 180 \
  820.     -t {Give attributes in}  10 185 150 200\
  821.     -m {[list [lindex $attrTxt $HTMLmodeVars(useBigWindows)]] {dialog boxes} {status bar}} 155 185 450 205 \
  822.     -t {Change attributes in} 10 210 150 225 \
  823.     -m {[list [lindex $attrTxt $HTMLmodeVars(changeInBigWindows)]] {dialog boxes} {status bar}} 155 210 450 230 \
  824.     -c {Beep for first attribute (applies only if you use the status bar)} $HTMLmodeVars(promptNoisily) 10 235 450 250 \
  825.     -c {Flash status bar for first attribute} $HTMLmodeVars(flashStatusBar) 10 255 450 270 \
  826.     -n {Page 2 of preferences} \
  827.     -c {Simple coloring} $HTMLmodeVars(simpleColoring) 10 65 450 80 \
  828.     -t {Color of HTML tags:} 10 85 150 100 \
  829.     -m [list [concat $HTMLmodeVars(tagColor) ${alpha::colors}]] 160 85 310 105 \
  830.     -t {Color of attributes:} 10 110 150 125 \
  831.     -m [list [concat $HTMLmodeVars(attributeColor) ${alpha::colors}]] 160 110 310 130 \
  832.     -t {Color of strings:} 10 135 150 150 \
  833.     -m [list [concat $HTMLmodeVars(stringColor) ${alpha::colors}]] 160 135 310 155 \
  834.     -t {'Help' opens} 10 160 95 175 \
  835.     -m {[concat [list [lindex $manTxt $HTMLmodeVars(manualStartPage)]] $manTxt]} 100 160 450 180 \
  836.     -c {Cmd-double-clicking on non-text file link opens file} $HTMLmodeVars(openNonTextFile) 10 190 450 205 \
  837.     -c {Return on non-text file in home page window opens file} $HTMLmodeVars(homeOpenNonTextFile) 10 210 450 225 \
  838.     -c {'Insert include tags' only inserts tags} $HTMLmodeVars(includeOnlyTags) 10 230 450 245 \
  839.     -n {Page 3 of preferences} \
  840.     -t {'Last modified' text} 10 65 150 80 -e [list $HTMLmodeVars(lastModified)] 160 65 450 80 \
  841.     -t {HTML menu icon:} 10 90 170 105 \
  842.     -m [list [concat [list [lindex $htmlIconTxt [lsearch $htmlIcons $HTMLmodeVars(htmlMenuIcon)]]] $htmlIconTxt]] 180 90 450 110 \
  843.     -t {HTML Utilities menu icon:} 10 115 170 130 \
  844.     -m [list [concat [list [lindex $htmlIconTxt [lsearch $htmlIcons $HTMLmodeVars(htmlUtilsMenuIcon)]]] $htmlIconTxt]] 180 115 450 135"
  845.  
  846.     return $box
  847. }
  848.  
  849. proc htmlGeneralFlags {} {
  850.     return [list browseInForeground saveWithoutAsking useLowerCase useTabMarks pIsContainer lidtAreContainers \
  851.     useBigWindows changeInBigWindows promptNoisily flashStatusBar simpleColoring \
  852.     tagColor attributeColor stringColor manualStartPage openNonTextFile homeOpenNonTextFile \
  853.     includeOnlyTags lastModified htmlMenuIcon htmlUtilsMenuIcon]
  854. }
  855.  
  856. proc htmlIndentationPrefsBox {} {
  857.     global HTMLmodeVars htmlIndentElements
  858.     set box "-t {HTML mode Indentation Preferences} 100 10 450 30 \
  859.     -t {Indent the content of} 10 40 450 55"
  860.     set ww 70; set hh 10
  861.     foreach ind $htmlIndentElements {
  862.         append box " -c $ind $HTMLmodeVars(indent${ind}) $hh $ww [expr $hh + 100] [expr $ww + 15]"
  863.         incr ww 20
  864.         if {$ww > 200} {
  865.             set ww 70
  866.             incr hh 110
  867.         }
  868.     }
  869.     return $box
  870. }
  871.  
  872. proc htmlIndentationFlags {} {
  873.     global htmlIndentElements
  874.     return "indent[join $htmlIndentElements " indent"]"
  875. }    
  876.  
  877. if {![alpha::package vsatisfies ${alpha::version} 7.1b1]} {
  878. proc htmlJavaScriptPrefsBox {} {
  879.     global HTMLmodeVars alpha::colors
  880.     set box "-t {HTML mode JavaScript and CSS Preferences} 100 10 450 30 \
  881.     -c {Electric left braces} $HTMLmodeVars(elecLBrace) 10 35 450 50 \
  882.     -c {Electric right braces} $HTMLmodeVars(elecRBrace) 10 55 450 70 \
  883.     -c {Electric semicolon} $HTMLmodeVars(electricSemi) 10 75 450 90 \
  884.     -c {Color JavaScript keywords} $HTMLmodeVars(JavaScriptColoring) 10 95 450 110\
  885.     -t {Color of JavaScript keywords:} 10 115 215 130 \
  886.     -m [list [concat $HTMLmodeVars(JavaScriptColor) ${alpha::colors}]] 220 115 360 135 \
  887.     -c {Color CSS keywords} $HTMLmodeVars(CSSColoring) 10 165 450 180\
  888.     -t {Color of CSS keywords:} 10 185 215 200 \
  889.     -m [list [concat $HTMLmodeVars(CSSColor) ${alpha::colors}]] 220 185 360 205 \
  890.     -t {Color of JavaScript and CSS comments:} 10 210 270 225 \
  891.     -m [list [concat $HTMLmodeVars(JavaCommentColor) ${alpha::colors}]] 275 210 420 230"
  892.     
  893.     return $box
  894. }
  895.  
  896. proc htmlJavaScriptFlags {} {
  897.     return [list  elecLBrace elecRBrace electricSemi\
  898.     JavaScriptColoring JavaScriptColor CSSColoring CSSColor JavaCommentColor]
  899. }
  900. } else {
  901. proc htmlJavaScriptPrefsBox {} {
  902.     global HTMLmodeVars alpha::colors
  903.     set box "-t {HTML mode JavaScript and CSS Preferences} 100 10 450 30 \
  904.     -c {Color JavaScript keywords} $HTMLmodeVars(JavaScriptColoring) 10 35 450 50\
  905.     -t {Color of JavaScript keywords:} 10 55 215 70 \
  906.     -m [list [concat $HTMLmodeVars(JavaScriptColor) ${alpha::colors}]] 220 55 360 75 \
  907.     -c {Color CSS keywords} $HTMLmodeVars(CSSColoring) 10 105 450 120\
  908.     -t {Color of CSS keywords:} 10 125 215 140 \
  909.     -m [list [concat $HTMLmodeVars(CSSColor) ${alpha::colors}]] 220 125 360 145 \
  910.     -t {Color of JavaScript and CSS comments:} 10 150 270 165 \
  911.     -m [list [concat $HTMLmodeVars(JavaCommentColor) ${alpha::colors}]] 275 150 420 270"
  912.     
  913.     return $box
  914. }
  915.  
  916. proc htmlJavaScriptFlags {} {
  917.     return [list JavaScriptColoring JavaScriptColor CSSColoring CSSColor JavaCommentColor]
  918. }
  919. }
  920.  
  921. proc htmlCheckingPrefsBox {} {
  922.     global HTMLmodeVars
  923.     set box "-t {HTML mode Checking Links Preferences} 100 10 450 30 \
  924.     -t {These settings apply when you check links with Alpha:} 10 40 450 55 \
  925.     -c {Check anchors} $HTMLmodeVars(checkAnchors) 10 60 450 75 \
  926.     -c {Case sensitive checking (slower)} $HTMLmodeVars(caseSensitive) 10 80 450 95 \
  927.     -t {These settings apply when you check links with Big Brother:} 10 105 450 120\
  928.     -c {Bring Big Brother to front when checking links} $HTMLmodeVars(checkInFront) 10 125 450 140\
  929.     -c {Use Big Brother's link check options} $HTMLmodeVars(useBBoptions) 10 145 450 160\
  930.     -c {Ignore remote links (if you don't use Big Brother's option)} $HTMLmodeVars(ignoreRemote) 30 165 450 180\
  931.     -c {Ignore local links (if you don't use Big Brother's option)} $HTMLmodeVars(ignoreLocal) 30 185 450 200"
  932.     return $box
  933. }
  934.  
  935. proc htmlCheckingFlags {} {
  936.     return [list checkAnchors caseSensitive checkInFront useBBoptions ignoreRemote ignoreLocal]
  937. }
  938.  
  939. proc htmlWordPrefsBox {} {
  940.     global HTMLmodeVars
  941.     set box "-t {HTML mode Word Wrapping Preferences} 100 10 450 30 \
  942.     -t {Line width:} 10 40 90 55 -e [list $HTMLmodeVars(fillColumn)] 100 40 140 55 \
  943.     -t characters 145 40 300 55 \
  944.     -t {The variables below determine which characters build up words, and the word wrapping. Normally\
  945.     there is no need to change them. Read about them in general manual if you want to change them.} \
  946.     10 70 450 130 \
  947.     -t wordBreak: 10 140 150 155 -e [list $HTMLmodeVars(wordBreak)] 155 140 450 155 \
  948.     -t wordBreakPreface: 10 165 150 180 -e [list $HTMLmodeVars(wordBreakPreface)] 155 165 450 180 \
  949.     -t wrapBreak: 10 190 150 205 -e [list $HTMLmodeVars(wrapBreak)] 155 190 450 205 \
  950.     -t wrapBreakPreface: 10 215 150 230 -e [list $HTMLmodeVars(wrapBreakPreface)] 155 215 450 230"
  951. }
  952.  
  953. proc htmlWordFlags {} {
  954.     return [list fillColumn wordBreak wordBreakPreface wrapBreak wrapBreakPreface]
  955. }
  956.  
  957. proc htmlGlobalAttrsPrefs {} {
  958.     global HTMLmodeVars modifiedModeVars
  959.     set attrs " ID= CLASS= STYLE= TITLE= LANG= DIR= onClick= onDblClick= \
  960.      onMouseDown= onMouseUp= onMouseOver= onMouseMove= onMouseOut= onKeyPress= onKeyDown= onKeyUp="
  961.     set alwaysask $HTMLmodeVars(alwaysaskforAttributes)
  962.     set dontask $HTMLmodeVars(dontaskforAttributes)
  963.     set hidden $HTMLmodeVars(neveraskforAttributes)
  964.     htmlUseAttrsDialog "HTML mode Attributes Preferences" $attrs "" alwaysask hidden dontask 1
  965.     set HTMLmodeVars(alwaysaskforAttributes) $alwaysask
  966.     set HTMLmodeVars(dontaskforAttributes) $dontask
  967.     set HTMLmodeVars(neveraskforAttributes) $hidden
  968.     lappend modifiedModeVars {alwaysaskforAttributes HTMLmodeVars} {dontaskforAttributes HTMLmodeVars} {neveraskforAttributes HTMLmodeVars}
  969. }
  970.  
  971. if {[file exists $PREFS:HTMLadditions.tcl]} {
  972.     if {[catch {htmlReadAdditions}]} {alertnote "An error occured while reading your custom elements."}
  973. }
  974. rename htmlReadAdditions ""
  975. rename htmlReadAdditions0 ""
  976.  
  977. htmlBuildMenu
  978. htmlBuildUtilsMenu
  979. htmlColorizing
  980. # Check that all home page folders exist.
  981. set tmp_notfind ""
  982. foreach tmp_hp $HTMLmodeVars(homePages) {
  983.     if {![file exists [lindex $tmp_hp 0]] || ![file isdirectory [lindex $tmp_hp 0]]} {
  984.         alertnote "Can't find the folder for the home page [lindex $tmp_hp 1][lindex $tmp_hp 2]"
  985.         set tmp_notfind "[lindex $tmp_hp 1][lindex $tmp_hp 2]"
  986.     }
  987. }
  988. if {$tmp_notfind != ""} {htmlHomePages $tmp_notfind}
  989. catch {unset tmp tmp_notfind tmp_hp}
  990.  
  991. # Define a couple of key bindings.
  992. if {[file exists "$PREFS:HTML:HTML entity keys"]} {
  993.     source "$PREFS:HTML:HTML entity keys"
  994. } else {        
  995.     if {![info exists htmlEntityKeys([list less than])]} {
  996.         set htmlEntityKeys([list less than]) "<U<B<I/,"
  997.         set htmlEntityKeysProc([list less than]) {htmlInsertCharacter "less than"}
  998.     }
  999.     if {![info exists htmlEntityKeys([list greater than])]} {
  1000.         set htmlEntityKeys([list greater than]) "<U<B<I/."
  1001.         set htmlEntityKeysProc([list greater than]) {htmlInsertCharacter "greater than"}
  1002.     }
  1003.     if {![info exists htmlEntityKeys(ampersand)]} {
  1004.         set htmlEntityKeys(ampersand) "<U<B<I/7"
  1005.         set htmlEntityKeysProc(ampersand) {htmlInsertCharacter ampersand}
  1006.     }
  1007.     if {![info exists htmlEntityKeys([list nonbreak space])]} {
  1008.         set htmlEntityKeys([list nonbreak space]) "<U<B<I/ "
  1009.         set htmlEntityKeysProc([list nonbreak space]) {htmlInsertCharacter "nonbreak space"}
  1010.     }
  1011.     htmlSaveCache "HTML entity keys" "array set htmlEntityKeys [list [array get htmlEntityKeys]]\rarray set htmlEntityKeysProc [list [array get htmlEntityKeysProc]]"
  1012. }
  1013.  
  1014. bind::fromArray htmlEntityKeys htmlEntityKeysProc 0 HTML
  1015. catch {unset htmlEntityKeys htmlEntityKeysProc}
  1016.  
  1017. proc htmlBindBraces {args} {
  1018.     global bind::LeftBrace bind::RightBrace
  1019.     eval bind [keys::toBind ${bind::LeftBrace}] htmlLeftBrace HTML
  1020.     eval bind [keys::toBind ${bind::RightBrace}] htmlRightBrace HTML
  1021. }
  1022. htmlBindBraces
  1023. trace variable bind::LeftBrace w htmlBindBraces
  1024. trace variable bind::RightBrace w htmlBindBraces
  1025.  
  1026. # Comment line
  1027. bind 'l' <C>  htmlCommentLine HTML
  1028.  
  1029.  
  1030. # Register hooks
  1031. hook::register saveHook htmlUpdateLastMod HTML
  1032. hook::register saveasHook htmlUpdateLastMod HTML
  1033. hook::register quitHook htmlQuitHook
  1034. hook::register closeHook htmlCloseHook Home
  1035. hook::register deactivateHook htmldeactivateHook Home
  1036. hook::register activateHook htmlActivateHook HTML
  1037. hook::register openHook htmlActivateHook HTML
  1038.  
  1039. proc HTML::OptionTitlebar {} {
  1040.     global htmlPopUptag
  1041.     return [set htmlPopUptag [htmlGetAttributes]]
  1042. }
  1043.  
  1044. proc HTML::OptionTitlebarSelect {item} {
  1045.     global htmlPopUptag
  1046.     if {[lsearch -exact $htmlPopUptag $item] >= 0} {
  1047.         htmlInsertAttributes $item
  1048.     } else {
  1049.         error "Not an attibute."
  1050.     }
  1051. }
  1052.  
  1053. if {![alpha::package vsatisfies ${alpha::version} 7.1b1]} {
  1054. proc htmlLeftBrace {} {
  1055.     global elecLBrace
  1056.     set old $elecLBrace
  1057.     if {![htmlIsInContainer SCRIPT] && ![htmlIsInContainer STYLE]} {
  1058.         set elecLBrace 0
  1059.     }
  1060.     catch {bind::LeftBrace}
  1061.     set elecLBrace $old
  1062. }
  1063. proc htmlRightBrace {} {
  1064.     global elecRBrace
  1065.     set old $elecRBrace
  1066.     if {![htmlIsInContainer SCRIPT] && ![htmlIsInContainer STYLE]} {
  1067.         set elecRBrace 0
  1068.     }
  1069.     catch {bind::RightBrace}
  1070.     set elecRBrace $old
  1071. }
  1072. } else {
  1073. proc htmlLeftBrace {} {
  1074.     global electricBraces
  1075.     set old $electricBraces
  1076.     if {![htmlIsInContainer SCRIPT] && ![htmlIsInContainer STYLE]} {
  1077.         set electricBraces 0
  1078.     }
  1079.     catch {bind::LeftBrace}
  1080.     set electricBraces $old
  1081. }
  1082. proc htmlRightBrace {} {
  1083.     global electricBraces
  1084.     set old $electricBraces
  1085.     if {![htmlIsInContainer SCRIPT] && ![htmlIsInContainer STYLE]} {
  1086.         set electricBraces 0
  1087.     }
  1088.     catch {bind::RightBrace}
  1089.     set electricBraces $old
  1090. }
  1091. }
  1092. if {[info exists cssModeIsLoaded] && $htmlVersion != $cssVersion} {
  1093.     alertnote "Warning: The versions of HTML mode and CSS mode may not be compatible.\
  1094.         Always install new versions of HTML mode and CSS mode simultaneously."
  1095. }
  1096.  
  1097. set htmlModeIsLoaded 1
  1098.  
  1099. message "HTML initialization complete."
  1100.